home *** CD-ROM | disk | FTP | other *** search
- ;
- ; *** Listing 3 ***
- ;
- ;Byte-move graphics driver for putting rectangular images into
- ; the Color/Graphics Adapter's medium-resolution memory map.
- ;
- ; Inputs (DS and CS must be the same, ES must contain 0B800h):
- ;
- ; BX - Row at which to put the top of the image. Range is 0 to 198.
- ; BX must be even: images cannot start at an odd row.
- ;
- ; CX - The column at which to start the image in bytes. Range is
- ; 0 to 79.
- ;
- ; SI - Points to data structure which contains the image description.
- ; The first byte is the height in lines (h). The second is the
- ; width of the image in bytes (w). h*w image bytes follow which
- ; contain the values to be placed into the screen memory map.
- ; The image bytes are ordered as h consecutive sets of w line
- ; image bytes. h must be an even number; images must be an
- ; even number of scan lines high.
- ;
- ; Outputs:
- ;
- ; None.
- ;
- ; Note: AX,BX,CX,DX,BP,SI,DI destroyed.
- ;
- cseg segment para public 'cseg'
- assume cs:cseg,ds:cseg,es:nothing
- public byte_move_form_driver
- ;
- byte_move_form_driver proc near
- mov di,[bx+even_line_screen_offset_table] ;find the offset
- ; of the top
- ; line of image
- add di,cx ;ES:DI now points to byte at which to put
- ; the image's upper left corner
- lodsb ;get the height of the image
- xor ah,ah ;make height a word value for calculations
- mov bx,ax ;store height in BX
- lodsb ;get the width of the image in bytes
- mov bp,2000h ;calculate the amount to add after even scan
- sub bp,ax ; lines are drawn to get to the address of the
- ; next scan line
- mov dx,1fb0h ;calculate the amount to subtract after odd
- add dx,ax ; scan lines are drawn to get to the address
- ; of the next scan line
- jmp [bx+inline_height_vector_table-2] ;-2 because there is
- ; no zero lines entry
- ; point
- ;
- ;This table is used to find the offset of an even scan line in
- ; the memory map of the color graphics adapter in medium
- ; resolution mode.
- ;
- even_line_screen_offset_table label word
- x=0
- rept 100 ;there are 100 even lines
- dw x*50h ; each is 50h (80 decimal) long
- x=x+1
- endm
- ;
- ;This is inline code for moving the image into the screen memory map.
- ;
- label macro x ;this macro is used to label the inline code
- line&x&: ; entry points
- endm
- ;
- x=42 ;there will be an entry point for each even
- ; number of lines between 2 and 40. They will
- ; be labeled "line2", "line4", ... "line40"
- rept 20
- x=x-2 ;calculate number of lines for this entry point
- label %x ;put in label for entry point
- mov cx,ax ;put width of image in bytes in CX to prepare
- rep movsb ; for repeated move string on even line
- add di,bp ;calc address of next line DI + (2000h-width)
- mov cx,ax ;put width of image in bytes in CX to prepare
- rep movsb ; for repeated move string on odd line
- sub di,dx ;calc address of next line DI - (1fb0h+width)
- endm
- ret
- ;
- ;This table is used as an indirect address for jumping into
- ; the inline code for image moving.
- ;
- inline_height_vector_table label word ;there is no entry point for zero
- ; lines. Starting at 2 eliminates
- ; the need to store a dummy entry
- ; point address
- entry_address macro x ;this macro is used to generate
- dw line&x& ; the labels corresponding to
- endm ; the inline code entry points
- ;
- x=2
- rept 20
- entry_address %x
- x=x+2
- endm
- ;
- byte_move_form_driver endp
- ;
- cseg ends
- end